package scala.com.shujia.jichu

import java.util.Scanner
import scala.util.control.Breaks._ // scala中大部情况下，表示所有或者默认值或者占位符的时候，使用的是下划线


object Demo2Base {
  def main(args: Array[String]): Unit = {
    /**
     * 变量：在程序的运行过程中，其值可以发生改变的量
     * 在scala中定义一个变量，需要使用一个关键词：var
     *
     * 注意：
     * 1、变量一旦定义，它的类型就确定，可以不用手动指定类型，根据赋的值自动推断出类型
     * 2、也可以手动的指定变量的数据类型，完整的写法：var 变量名:数据类型 = 值
     *
     * scala中的数据类型和java的数据类型对应关系：
     * java:              scala:
     * byte                Byte
     * short               Short
     * int                 Int
     * long                Long
     * float               Float
     * double              Double
     * boolean             Boolean
     * char                Char
     */
    //定义一个变量a1,并赋值100
    //    var a1 = 100
    //    println(a1)
    //    println(a1.getClass) // 获取变量的类型
    ////    a1 = "你好"
    ////    println(a1)
    //    a1 = 200
    //    println(a1)

    //定义一个整数类型的变量a2,并赋值11
    //    var a2: Int = 11
    //    println(a2)
    //    println(a2.getClass)
    //    //    println("==============================================")
    //    println("=" * 50) // * 其实是一个函数，底层是通过StringBuilder链接字符的
    //    //    println("=".*(50))
    //
    //    /**
    //     * 定义常量：在程序的运行过程中，其值不能发生改变的量
    //     * 在scala中定义一个常量，需要使用一个关键词：val
    //     */
    //    //定义一个整数常量a3,赋值300
    //    val a3: Int = 300
    //    println(a3)
    //    //    a3=110
    //    //    println(a3)
    //    println("=" * 50)
    //
    //    /**
    //     * scala中字符串的使用
    //     * 字符串：由若干个字符组成的序列
    //     */
    //    //正常使用双引号构建字符串
    //    var s1: String = "易政是世界上最帅的男人！"
    //    println(s1)
    //    //使用三个一对双引号构建长字符串
    //    var sql1: String =
    //      """
    //        |select
    //        |*
    //        |from
    //        |students
    //        |where age>18
    //        |""".stripMargin
    //    println(sql1)
    //
    //    //String类和java是共同的一个字符串类，String类中的功能在scala中正常使用
    //    var s3 = "hello,world,java,hadoop,scala"
    //    val arr1: Array[String] = s3.split(",")
    //    //    val arr1: Array[String] = s3 split ","
    //    //    println(arr1)
    //    //scala中的数组和java中的数组一样，也是有索引的，也是从0开始的
    //    println(arr1(0))
    //    println(arr1(1))
    //    println(arr1(2))
    //    println(arr1(3))
    //    println(arr1(4))
    //    println("=" * 50)
    //    /**
    //     * 在scala中字符串是如何做拼接的？
    //     * 1、使用+号拼接 这种拼接方式比较消耗性能
    //     * 2、使用StringBuilder
    //     * 3、前提：有一组序列，使用scala特有的函数 mkString
    //     * 4、使用scala特有的字符串传递方式 s"${变量}" 底层就是使用StringBuilder方式拼接的
    //     */
    //    var q1: String = "hello"
    //    var q2: String = "world"
    //    var q3: String = "java"
    //    var res1: String = q1 + "|" + q2 + "|" + q3
    //    println(res1)
    //
    //    val sb: StringBuilder = new StringBuilder()
    //    sb.append(q1).append("-").append(q2).append("-").append(q3)
    //    println(sb)
    //
    //    val res3: String = arr1.mkString("&")
    //    println(res3)
    //
    //    val res4: String = s"${q1.toUpperCase}#${q2}#${q3}"
    //    println(res4)
    //    println("=" * 50)
    //    /**
    //     * 运算符
    //     *
    //     */
    //    var x: Int = 3
    //    var y: Int = 4
    //
    //    println(x + y)
    //    println(x - y)
    //    println(x * y)
    //    println(x * 1.0 / y) // 整除
    //    println(x % y)
    //    println("=" * 50)
    //    println("hello" + 4)
    //
    //    println("=" * 50)
    /**
     * 条件语句
     * 选择语句：if
     * 循环语句：
     */
    //    val sc: Scanner = new Scanner(System.in)
    //    print("请输入年龄：")
    //    val age: Int = sc.nextInt()
    //    if(age>18){
    //      println("成年了")
    //    }else{
    //      println("未成年")
    //    }

    //创建一个数组
    //数组：在内存中一块连续固定大小的空间，有索引可以检索数据，查询快，增删慢
    val arr2: Array[Int] = Array(11, 22, 33, 44, 55)
    //    println(arr2(0))
    //    println(arr2(1))
    //    println(arr2(2))
    //    println(arr2(3))
    //    println(arr2(4))
    /**
     * 注意：
     * 1、在scala语言中，没有++或者--的语法  i+=1  i= i+1
     * 2、在scala语言中，不存在和java一样的普通for循环
     * 3、scala中的for循环写法不太一样
     */
    //    for(var i:Int =0;i<arr2.length;i+=1){
    //      println(arr2(i))
    //    }
    //    for (e <- arr2) {
    //      println(e)
    //    }

    /**
     * while循环
     */
    //    var i:Int = 0
    //    while (i<arr2.length){
    //      println(arr2(i))
    //      i+=1
    //    }

    /**
     * 需求：在控制台中输出10行hello world
     */
    //这是使用while循环实现
    //    var i:Int = 1
    //    while (i<=10){
    //      println("hello world")
    //      i+=1
    //    }
    //使用for循环，指定循环的次数

    for (e <- 1 to 10) {
      println(e)
    }
    println("=" * 50)
    for (e <- 1 until 10) {
      println(e)
    }
    println("=" * 50)

    /**
     * 控制流程语句
     * 注意：在scala中没有break或者continue关键字
     */
    //    for (e <- 1 to 10) {
    //      if(e==5){
    //        continue // scala中没有continue关键字
    //      }
    //      println(e)
    //    }

    breakable {
      for (e <- 1 to 10) {
        if (e == 5) {
          break // 底层实现是一个函数，抛出一个异常，终止程序运行
        }
        println(e)
      }
    }
    println("易政真帅！")


  }
}
